#pragma once

#include "universal.h"
#include "Stack.h"



// 选择排序
void SelectSort(int* arr, int n);

// 堆排序
void HeapSort(int* arr, int n);

// 插入排序
void InsertSort(int* arr, int n);

// 希尔排序
void ShellSort(int* arr, int n);

// 冒泡排序
void BubbleSort(int* arr, int n);

// 归并排序递归版
void MergeSort(int* arr, int n);

// 归并排序非递归版
void MergeSortNor(int* arr, int n);



// 快排专区

// hoare版本
int Partition1(int* arr, int left, int right);
// 挖坑法
int Partition2(int* arr, int left, int right);
// 前后指针法
int Partition3(int* arr, int left, int right);
// 三路划分法
int Partition4(int* arr, int left, int right);

// 递归版本与非递归版本
void QuickSort(int* arr, int n, int (*partition)(int*, int, int));
void QuickSortNor(int* arr, int n, int (*partition)(int*, int, int));

// 包含递归与非递归的框架
void QuickSortFrame(int* arr, int n, int (*partition)(int*, int, int), bool is_recursive);

// 内省排序 Introsort(introspective sort)
void IntroSort(int* arr, int n);